# 检查markdown文件中是否存在大量重复行
from collections import defaultdict
import difflib
import os
import json

def check_duplicate_lines(md_file_path: str, threshold: int = 20, similarity_ratio: float = 0.9) -> bool:
    """
    检查markdown文件中是否存在大量重复行
    
    Args:
        md_file_path: markdown文件路径
        threshold: 重复行数阈值，默认20行
        similarity_ratio: 相似度阈值，默认0.9（90%相似即认为相同）
    
    Returns:
        bool: 如果存在大量重复行返回True，否则返回False
    """

    
    try:
        # 读取文件内容
        with open(md_file_path, 'r', encoding='utf-8') as f:
            lines = [line.strip() for line in f.readlines() if line.strip()]
        
        if not lines:
            print(f"文件 {md_file_path} 为空")
            return False
            
        # 使用字典统计相似行
        similar_lines = defaultdict(list)
        
        # 遍历所有行，将相似的行分组
        for i, line in enumerate(lines):
            found_similar = False
            for key in similar_lines.keys():
                # 使用difflib计算相似度
                similarity = difflib.SequenceMatcher(None, key, line).ratio()
                if similarity >= similarity_ratio:
                    similar_lines[key].append(i)
                    found_similar = True
                    break
            if not found_similar:
                similar_lines[line].append(i)
        
        # 检查是否有超过阈值的重复行组
        for line, indices in similar_lines.items():
            if len(indices) >= threshold:
                print(f"发现重复内容:")
                print(f"重复行: {line}")
                print(f"重复次数: {len(indices)}")
                print(f"首次出现位置: 第 {indices[0]+1} 行")
                print(f"最后出现位置: 第 {indices[-1]+1} 行")
                return True
                
        return False
        
    except Exception as e:
        print(f"检查文件 {md_file_path} 时发生错误: {str(e)}")
        return False

def check_folder_duplicates(folder_path: str, threshold: int = 20, similarity_ratio: float = 0.9) -> list:
    """
    检查文件夹中所有文件是否包含重复行
    
    Args:
        folder_path: 文件夹路径
        threshold: 重复行数阈值
        similarity_ratio: 相似度阈值
    
    Returns:
        list: 包含重复行的文件名列表
    """
    duplicate_files = []
    
    try:
        # 遍历文件夹中的所有文件
        for filename in os.listdir(folder_path):
            file_path = os.path.join(folder_path, filename)
            
            # 检查是否为文件
            if os.path.isfile(file_path):
                print(f"正在检查文件: {filename}")
                if check_duplicate_lines(file_path, threshold, similarity_ratio):
                    duplicate_files.append(filename)
        
        return duplicate_files
        
    except Exception as e:
        print(f"检查文件夹时发生错误: {str(e)}")
        return []

def export_to_json(data: list, output_file: str = "duplicate_files.json") -> None:
    """
    将数据导出为JSON文件
    
    Args:
        data: 要导出的数据
        output_file: 输出文件路径
    """
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=4)
        print(f"结果已保存到: {output_file}")
    except Exception as e:
        print(f"导出JSON文件时发生错误: {str(e)}")

# 使用示例
if __name__ == "__main__":
    # 单文件检查用例
    # md_file = "/data/hyq/code/llf/yuanshenqidong_ocr上传功能版本/backend/app/algorithms/agent/【简历】樊成成-博士-东南大学-动力工程及工程热物理(1).md"
    # has_duplicates = check_duplicate_lines(md_file)
    # export_to_json(has_duplicates)
   
    
    # 文件夹下批量检查示例
    folder_path = r"C:\Users\lenovo\Desktop\ocr_ori_md_3800"
    print(f"\n开始检查文件夹: {folder_path}")
    
    # 1. 创建列表存储包含重复行的文件
    duplicate_files = check_folder_duplicates(folder_path)
    
    # 2. 输出检查结果
    if duplicate_files:
        print(f"发现 {len(duplicate_files)} 个包含重复内容的文件:")
        for file in duplicate_files:
            print(f"- {file}")
    else:
        print("所有文件正常，未发现包含重复内容的文件。")
    
    # 3. 导出结果到JSON文件
    export_to_json(duplicate_files)